package com.amuse.amuse.controller;

import com.amuse.amuse.entity.*;
import com.amuse.amuse.entity.clubAnnouncements;
import com.amuse.amuse.entity.clubApplications;
import com.amuse.amuse.entity.clubs;
import com.amuse.amuse.service.impl.ClubPermissionsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RestController
@CrossOrigin
@RequestMapping("/clubManger")
public class ClubPermissionsController extends BaseController{
    @Autowired
    private ClubPermissionsServiceImpl clubPermissionsService;
    @PostMapping("/addClubAnnouncements")
    /**
     * 添加社团公告
     * 该方法用于向俱乐部添加新的公告。只有具备相应权限的用户才能调用此方法。
     * 公告的添加是通过调用clubPermissionsService的addClubAnnouncements方法实现的。
     *
     * @param announcementId 公告ID，可选参数，用于指定要添加的公告的ID。
     * @param clubId 俱乐部ID，可选参数，指定公告所属的俱乐部。
     * @param publishDate 发布日期，可选参数，指定公告的发布日期。
     * @param content 公告内容，可选参数，指定公告的具体内容。
     * @param title 公告标题，可选参数，指定公告的标题。
     * @return ResponseData 对象，包含操作结果的成功与否。
     */
    public ResponseData addClubAnnouncements(
            @RequestParam(required = false) String  announcementId,
            @RequestParam(required = false) Integer clubId,
            @RequestParam(required = false) String publishDate,
            @RequestParam(required = false) String content,
            @RequestParam(required = false) String title
    ){
        // 调用服务层方法添加俱乐部公告，并将返回的结果转换为操作成功与否的响应数据
        Integer integer = clubPermissionsService.addClubAnnouncements(announcementId, clubId, content, publishDate, title);
        return resultBoolean(integer > 0);
    }

    /**
     * 删除俱乐部公告
     *
     * @param announcementId 公告ID，可选参数，用于指定要删除的具体公告
     * @param clubId 俱乐部ID，可选参数，用于限定删除范围，只有属于该俱乐部的公告才能被删除
     * @return 返回一个表示操作结果的ResponseData对象，如果删除成功（即影响的行数大于0），则返回成功响应，否则返回失败响应
     */
    @PostMapping("/deleteClubAnnouncements")
    public ResponseData deleteClubAnnouncements(
            @RequestParam(required = false) String announcementId,
            @RequestParam(required = false) Integer clubId
    ){
        // 调用clubPermissionsService的deleteClubAnnouncements方法删除公告
        // 方法的返回值是被删除的记录数
        Integer integer = clubPermissionsService.deleteClubAnnouncements(announcementId, clubId);
        // 根据删除结果转换为对应的响应数据，如果删除的记录数大于0，则视为删除成功
        return resultBoolean(integer > 0);
    }

/*
*   更新社团公告
* */
    @PostMapping("/updateClubAnnouncements")
    public ResponseData updateClubAnnouncements(
            @RequestParam(required = false) Integer clubId,
            @RequestParam(required = false) String announcementId,
            @RequestParam(required = false) String title,
            @RequestParam(required = false) String content,
            @RequestParam(required = false) String publishDate
    ){
        // 调用clubPermissionsService的updateClubAnnouncements方法更新公告
        // 方法的返回值是更新后的记录数
        Integer integer = clubPermissionsService.updateClubAnnouncements(clubId, announcementId, title, content, publishDate);
        // 根据更新结果转换为对应的响应数据，如果更新后的记录数大于0，则视为更新成功
        return resultBoolean(integer > 0);
    }

    /**
     * 更新社团描述的接口。
     *
     * 通过此接口，允许用户更新社团的描述信息。接口使用POST请求方法，
     * 请求路径为/updateClubDescription。请求参数包括clubId（俱乐部ID）和description（俱乐部描述）。
     *
     * @param clubId 俱乐部ID，可选参数。如果提供此参数，则更新指定俱乐部的描述；
     *               如果不提供，则不更新俱乐部ID相关的描述。
     * @param description 俱乐部描述，可选参数。提供此参数时，将更新俱乐部的描述信息；
     *                    如果不提供，则不更新俱乐部的描述。
     * @return 返回一个ResponseData对象，其中包含操作结果的信息。
     *         如果更新成功（即至少有一项信息被更新），则返回true；
     *         如果没有信息被更新或更新失败，则返回false。
     */
    @PostMapping("/updateClubDescription")
    public ResponseData updateClubDescription(
            @RequestParam(required = false) Integer clubId,
            @RequestParam(required = false) String description) {
        // 调用clubPermissionsService中的方法更新俱乐部描述
        Integer integer = clubPermissionsService.updateClubDescription(clubId, description);
        // 根据更新结果，生成并返回相应的ResponseData对象
        return resultBoolean(integer > 0);
    }

    /**
     * 查询社团公告
     *
     * @param pageNum 当前页码
     * @param pageSize 每页显示的记录数
     * @param clubId 社团ID，可选参数，用于查询特定俱乐部的公告
     * @return 返回包含公告信息的分页结果
     */
    @GetMapping("/findClubAnnouncements")
    public ResponseData<PageBean<clubAnnouncements>> findClubAnnouncements(
            Integer pageNum,
            Integer pageSize,
            @RequestParam(required = false) Integer clubId
    ){
        // 调用clubPermissionsService查询俱乐部公告
        PageBean<clubAnnouncements> clubAnnouncements = clubPermissionsService.findClubAnnouncements(pageNum, pageSize, clubId);
        // 将查询结果封装到ResponseData中返回
        return resultObj(clubAnnouncements);
    }

    /**
     * 根据俱乐部名称分页查询俱乐部信息。
     *
     * 本方法通过GET请求访问，用于查询俱乐部信息。支持通过俱乐部名称进行过滤查询，
     * 并提供分页功能以优化数据检索和展示。
     *
     * @param pageNum 当前页码，用于分页查询。
     * @param pageSize 每页显示的记录数，用于分页查询。
     * @param clubName 俱乐部名称，可选参数，用于根据俱乐部名称过滤查询结果。
     * @return ResponseData<PageBean<clubs>> 包含查询结果的响应对象。
     *         响应对象中，数据部分为分页查询结果的PageBean，其中包含了俱乐部信息的列表及分页相关数据。
     */
    @GetMapping("/findClubsInfo")
    public ResponseData<PageBean<clubs>> findClubsInfo(
            Integer pageNum,
            Integer pageSize,
            @RequestParam(required = false) String clubName
    ){
        // 调用俱乐部权限服务，查询符合条件的俱乐部信息。
        PageBean<clubs> clubsInfo = clubPermissionsService.findClubsInfo(pageNum, pageSize, clubName);
        // 将查询结果封装到响应对象中返回。
        return resultObj(clubsInfo);
    }


/**
 * 处理学生加入社团的申请
 *
 * @param clubId 社团ID，可选参数，表示目标社团的唯一标识
 * @param studentId 学生ID，可选参数，表示发起申请的学生的唯一标识
 * @return 返回一个ResponseData对象，其中包含操作的结果信息
 **/
 @PostMapping("/StudentsApplyToClub")
    public ResponseData StudentsApplyToClub(
            @RequestParam(required = false) Integer clubId,
            @RequestParam(required = false) Integer studentId
    ){
        return resultBoolean(clubPermissionsService.StudentsApplyToClub(clubId, studentId) > 0);
    }


    /**
     * 更新俱乐部申请状态。
     * 该接口用于更改俱乐部申请的状态，例如审批通过或拒绝。
     *
     * @param status 申请状态，true表示批准，false表示拒绝。该参数为可选参数。
     * @param studentId 学生ID，指定申请人的ID。该参数为可选参数。
     * @param clubId 俱乐部ID，指定申请的俱乐部。该参数为可选参数。
     * @return 返回一个表示操作结果的ResponseData对象，如果更新成功（影响行数大于0），则结果为true，否则为false。
     */
    @PostMapping("/updateClubApplication")
    public ResponseData updateClubApplication(
            @RequestParam(required = false) Integer status,
            @RequestParam(required = false) Integer studentId,
            @RequestParam(required = false) Integer clubId
    ){
        // 调用clubPermissionsService的updateClubApplications方法更新俱乐部申请状态，
        // 并检查影响的行数是否大于0，以确定操作是否成功。
        return resultBoolean(clubPermissionsService.updateClubApplications(status, studentId, clubId) > 0);
    }

    /**
     * 添加俱乐部成员
     * 通过此接口，可以向指定的俱乐部添加成员。需要提供俱乐部的ID，如果添加成功，返回true；否则返回false。
     *
     * @param clubId 俱乐部ID，可选参数。如果未提供，则默认为添加到所有俱乐部。
     * @return ResponseData 包含操作结果的响应数据对象。如果添加成员数量大于0，则操作成功。
     */
    @PostMapping("/addClubMembers")
    public ResponseData addClubMembers(
            @RequestParam(required = false) Integer clubId
    ){
        // 调用俱乐部权限服务添加成员，并检查添加的成员数量是否大于0，以确定操作是否成功。
        return resultBoolean(clubPermissionsService.addClubMembers(clubId) > 0);
    }


    @GetMapping("/findClubApplications")
    public ResponseData<PageBean<clubApplications>> findClubApplications(
            Integer pageNum,
            Integer pageSize,
            @RequestParam(required = false) Integer clubId
    ){
        // 调用clubPermissionsService查询俱乐部申请信息
        PageBean<clubApplications> clubApplications = clubPermissionsService.findClubApplications(pageNum, pageSize, clubId);
        // 将查询结果封装到ResponseData中返回
        return resultObj(clubApplications);
    }

    @GetMapping("/findCurrentMember")
    public ResponseData getCurrentMember(
            @RequestParam(required = false) Integer clubId
    ){
        clubs clubs = clubPermissionsService.getCurrentMember(clubId);
        return resultObj(clubs);
    }

}
